Skip to content

Tupychka/dev#23

Merged
tmlxrd merged 14 commits into
devfrom
tupychka/dev
Jun 9, 2026
Merged

Tupychka/dev#23
tmlxrd merged 14 commits into
devfrom
tupychka/dev

Conversation

@tmlxrd

@tmlxrd tmlxrd commented Jun 9, 2026

Copy link
Copy Markdown
Collaborator

Summary

Changes

Screenshots / GIFs

How to test

Checklist

  • PR targets dev
  • npm run typecheck passes
  • npm run build passes
  • Updated CHANGELOG.md under [Unreleased] if user-visible
  • Updated ROADMAP.md if a planned item is now done
  • No new heavyweight dependencies (or motivated in the description)

tmlxrd and others added 14 commits June 8, 2026 23:27
…comment tree

social_search gains a `url` mode: pass a Reddit post link to fetch that post
(title + selftext) plus its full, nested comment tree in one sandboxed call, no
API key. Discovery (`query`) mode is unchanged; the tool now takes query OR url,
and its description steers the model to prefer this over web_fetch for a known
Reddit link (and it works in Secure Mode, where host-side web_fetch isn't offered).

Comment scraping is a faithful port of last30days-skill's reddit_shreddit:
sort=top, thingId-anchored bodies bounded by the next rtjson anchor, skip
deleted/removed, \b-bounded attribute reads. We keep the whole tree with a
per-comment `depth` (rendered as indentation) instead of a top-10 digest.
Title/selftext come from old.reddit, anchored on the post's own t3_<id> so the
sidebar description is never mistaken for the body.

Verified live across r/ClaudeCode, r/selfhosted, r/homelab (self + link posts,
unicode). Known limit: first page of the tree only — deep "load more" branches
are not paginated.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Clickable poster (the mode picker) links to docs/iClaw_video.mp4, a ~50s no-sound walkthrough of inspecting an untrusted shell script in an isolated sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Use <picture> with prefers-color-scheme so the star-history chart matches the viewer's GitHub theme, instead of a single light-only image.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…oster

Demo now embeds the GitHub user-attachments asset so it plays inline in the README, like other repos. Removes the redundant committed docs/iClaw_video.mp4 (3.2 MB) and poster image now that GitHub hosts the video.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Long scheduled messages (and queued ones — they share the card) rendered at
full height and could take over the whole composer area. Clamp the message
text to 2 lines with a "Show more"/"Show less" toggle that appears only when
the content actually overflows; short messages are unchanged.

Restructure the card into a text block above a full-width footer strip:
schedule time (⏰) + toggle on the left, action buttons pushed to the right.
Overflow is measured client-side (applyPendingRowClamp) across both render
paths — server EJS first paint and JS live render — and both lists.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Pain-led pitch + comparison table vs OpenClaw, Hermes and Claude Code (sandbox safety, project isolation, cost / no lock-in, one-key setup, minimalist UI). Setup difficulty shown as a skull meter.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Work/Secure/Incognito sent image_url blocks to whatever ICLAW_MODEL is set, so a text-only default (deepseek/deepseek-v4-flash) made OpenRouter return "404 No endpoints found that support image input" (hit in chats 314/321). Full Power was unaffected — it forwards to OpenClaw's gateway, whose model is vision-capable.

Mirror OpenClaw's capability gate (iClaw is OpenRouter-only): new agent/model-capabilities.ts reads architecture.input_modalities from OpenRouter /models (cached 1h, stale-on-error, ICLAW_VISION_MODELS allowlist escape hatch). resolveTurnModel() only looks up on image turns and routes a confirmed text-only model to ICLAW_VISION_MODEL (default google/gemini-2.5-flash); text turns are untouched. Wired into both agent loops (loop.ts, secure-runner.ts) via an effectiveModel.

describeApiError is exported from loop.ts + gains an image-404 safety net for the unknown-capability path; secure-runner now uses it too. Tests: test/unit/modelCapabilities.test.ts (8).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Switch the context-compaction (summary) model default from
google/gemini-2.5-flash-lite to tencent/hy3-preview. Still
overridable via ICLAW_SUMMARY_MODEL.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- waveform now advances on a fixed 55ms cadence (was once per animation
  frame), so it scrolls ~3x slower — matching the Flutter app amplitude
  stream (~50ms)
- raise gain (2.4 -> 3.0) and carry the peak between samples so bars track
  loudness (taller when loud)
- hide the floating lock pill once locked; it was overlapping the hint
- locked state: drop the "tap mic to send" text and move Cancel down to the
  toolbar row, centered and level with the send button (wave gets the full row)
- center the quick-tap "hold the mic to record" hint

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
The secure-workspace bar keyed its visibility (and Export/Apply/Destroy +
TTL) off `rawChatId` — a const captured once at page load. A chat that
starts as a draft has no id until the first message adopts it; adoptDraftChat
updates messagesEl.dataset.chatId but rawChatId stays empty, so the bar
stayed hidden until a reload re-rendered at /chats/:id.

Read the id live via a secureChatId() helper instead, and refresh the bar on
turn-ended so it also appears after a slow first-turn sandbox start (the fixed
post-send retry timers can miss it).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Model defaults (all overridable via ICLAW_*_MODEL):
- Main agent, web-search, runtime summaries → minimax/minimax-m2.7
- Host chat compaction → tencent/hy3-preview; chat titles now reuse it
- STT / Vision stay on google/gemini-2.5-flash

Remove the unused "Ask" direct-OpenRouter path (replaced by Incognito):
- Drop streamComplete()/StreamCompletionOpts (zero callers) and the
  askModel config field; complete() now requires an explicit model.
- Refresh stale "Ask mode" copy in Settings (tab/section -> "Voice"),
  .env.example, and code comments. The live task-page Ask is untouched.

typecheck + full vitest suite (421 tests) pass; Settings page verified to render.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Secure Mode shipped no web-research tools: web_fetch/web_search are
host-side (a host fetch would bypass the container's --network gate), so
the agent fell back to hand-rolling `curl ... | jq` for any web/API call.

Add Secure variants that keep the sandbox boundary intact:
- web_fetch runs the fetch as curl INSIDE the sandbox (runInSandbox),
  then reuses the existing canonicalize / htmlToText / summarize / cache
  path on the host. The URL is shQuote'd against shell injection; the
  body is capped in-container (head -c) under the docker-exec stdout
  buffer, with the status+content-type marker emitted before the body.
- web_search uses only the OpenRouter web plugin (host->OpenRouter, same
  trust as the chat stream), gated on networkEnabled; no host DDG.

Wire both into the secure loop and steer the secure prompt to prefer
them over raw curl. Work/Incognito are unchanged.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Remove the unreachable "Apply changes" feature end-to-end — UI button,
host route /chats/:id/apply-sandbox, runtime /sessions/:id/apply,
secure-export helpers, and its tests. Secure Mode has no folder-ingest
UI, so apply could only ever report "nothing to apply". The dormant
copyFolders ingest plumbing is left in place.

Secure workspace bar:
- TTL is now per-chat (default 7 days); the whole bar stays hidden until
  the sandbox actually holds something.
- Unified "delete" vocabulary: "deletes in 6d" with an inline-clickable
  value that opens the retention menu; Destroy and Save are icon buttons
  that slide out their label on hover.
- "Save to my computer" (export) confirms with a plain-language warning
  that the files leave the sandbox; exported folders are named by local
  date-time instead of an epoch number.

Chat header: Share and Delete collapse to icons with hover-reveal labels
on desktop (mobile was already icon-only).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
@tmlxrd
tmlxrd merged commit 559c1c9 into dev Jun 9, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant